# Module 'shutil' -- fonctions utiles pour un programme de type shell

import posix
import path

MODEBITS = 010000	# Les 12 bits présents en début de fichier qui représentent
                        # le mode
# Donnez à cette variable la valeur 01000 (correspond à 9 bits) pour ne pas
# copier l'identifiant de l'utilisateur à qui appartient le fichier etc

# Copie les données contenues dans src vers dst
#
def copyfile(src, dst):
	fsrc = open(src, 'r')
	fdst = open(dst, 'w')
	while 1:
		buf = fsrc.read(16*1024)
		if not buf: break
		fdst.write(buf)

# Copie le mode de src vers dst
#
def copymode(src, dst):
	st = posix.stat(src)
	mode = divmod(st[0], MODEBITS)[1]
	posix.chmod(dst, mode)

# Copie toutes les statistiques (mode, date de dernier accès et date de
# dernière modification) de src vers dst
#
def copystat(src, dst):
	st = posix.stat(src)
	mode = divmod(st[0], MODEBITS)[1]
	posix.chmod(dst, mode)
	posix.utimes(dst, st[7:9])

# Copie les données et le mode (pareil que "cp src dst")
#
def copy(src, dst):
	copyfile(src, dst)
	copymode(src, dst)

# Copie les données et toutes les statistiques (pareil que "cp -p src dst")
#
def copy2(src, dst):
	copyfile(src, dst)
	copystat(src, dst)

# Copie une arborescence de répertoires de manière récursive.
# La destination doit déjà exister.
#
def copytree(src, dst):
	names = posix.listdir(src)
	posix.mkdir(dst, 0777)
	dot_dotdot = '.', '..'
	for name in names:
		if name not in dot_dotdot:
			srcname = path.cat(src, name)
			dstname = path.cat(dst, name)
			#print 'Copie de', srcname, 'vers', dstname
			try:
				#if path.islink(srcname):
				#	linkto = posix.readlink(srcname)
				#	posix.symlink(linkto, dstname)
				#elif path.isdir(srcname):
				if path.isdir(srcname):
					copytree(srcname, dstname)
				else:
					copy2(srcname, dstname)
				# XXX Que faire des sockets, des fichiers de périphérique etc?
			except posix.error, why:
				print 'Impossible de copier', srcname, 'vers', dstname,
				print '(', why[1], ')'
